home *** CD-ROM | disk | FTP | other *** search
MacBinary | 1996-09-22 | 10.4 KB | [TEXT/CWIE] |
open in:
MacOS 8.1
|
Win98
|
DOS
browse contents |
view JSON data
|
view as text
This file was processed as: MacBinary
(archive/macBinary).
Confidence | Program | Detection | Match Type | Support
|
---|
66%
| dexvert
| Compact Compressed (Unix) (archive/compact)
| ext
| Supported |
10%
| dexvert
| MacBinary (archive/macBinary)
| fallback
| Supported |
1%
| dexvert
| Text File (text/txt)
| fallback
| Supported |
100%
| file
| MacBinary II, inited, Sun Sep 22 16:06:21 1996, modified Sun Sep 22 16:06:21 1996, creator 'CWIE', type ASCII, 9930 bytes "ComputeLength.c" , at 0x274a 456 bytes resource
| default (weak)
| |
99%
| file
| data
| default
| |
74%
| TrID
| Macintosh plain text (MacBinary)
| default
| |
25%
| TrID
| MacBinary 2
| default (weak)
| |
100%
| siegfried
| fmt/1762 MacBinary (II)
| default
| |
100%
| lsar
| MacBinary
| default
|
|
id metadata |
---|
key | value |
---|
macFileType | [TEXT] |
macFileCreator | [CWIE] |
hex view+--------+-------------------------+-------------------------+--------+--------+
|00000000| 00 0f 43 6f 6d 70 75 74 | 65 4c 65 6e 67 74 68 2e |..Comput|eLength.|
|00000010| 63 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 |c.......|........|
|00000020| 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 |........|........|
|00000030| 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 |........|........|
|00000040| 00 54 45 58 54 43 57 49 | 45 01 00 00 00 00 00 00 |.TEXTCWI|E.......|
|00000050| 00 00 00 00 00 26 ca 00 | 00 01 c8 ae 6b 4c bd ae |.....&..|....kL..|
|00000060| 6b 4c bd 00 00 00 00 00 | 00 00 00 00 00 00 00 00 |kL......|........|
|00000070| 00 00 00 00 00 00 00 00 | 00 00 81 81 46 d0 00 00 |........|....F...|
|00000080| 2f 2f 0d 2f 2f 0d 2f 2f | 20 09 09 46 69 6c 65 3a |//.//.//| ..File:|
|00000090| 09 43 6f 6d 70 75 74 65 | 4c 65 6e 67 74 68 2e 63 |.Compute|Length.c|
|000000a0| 0d 2f 2f 0d 2f 2f 09 09 | 4a 6f 73 65 70 68 20 4d |.//.//..|Joseph M|
|000000b0| 61 75 72 65 72 2c 20 41 | 70 72 69 6c 20 31 39 39 |aurer, A|pril 199|
|000000c0| 36 0d 2f 2f 0d 2f 2f 0d | 0d 0d 0d 23 69 6e 63 6c |6.//.//.|...#incl|
|000000d0| 75 64 65 20 3c 73 74 64 | 69 6f 2e 68 3e 0d 23 69 |ude <std|io.h>.#i|
|000000e0| 6e 63 6c 75 64 65 20 3c | 54 79 70 65 73 2e 68 3e |nclude <|Types.h>|
|000000f0| 0d 23 69 6e 63 6c 75 64 | 65 20 3c 66 70 2e 68 3e |.#includ|e <fp.h>|
|00000100| 0d 0d 23 69 6e 63 6c 75 | 64 65 20 22 43 6f 6d 70 |..#inclu|de "Comp|
|00000110| 75 74 65 4c 65 6e 67 74 | 68 2e 68 22 0d 0d 09 09 |uteLengt|h.h"....|
|00000120| 2f 2a 20 62 65 74 74 65 | 72 20 74 68 61 6e 20 31 |/* bette|r than 1|
|00000130| 2f 32 20 70 69 78 65 6c | 20 2a 2f 0d 23 64 65 66 |/2 pixel| */.#def|
|00000140| 69 6e 65 20 6b 45 70 73 | 69 6c 6f 6e 09 09 30 2e |ine kEps|ilon..0.|
|00000150| 31 0d 0d 2f 2f 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |1..//---|--------|
|00000160| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00000170| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00000180| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00000190| 2d 2d 2d 2d 2d 2d 0d 73 | 74 72 75 63 74 20 43 75 |------.s|truct Cu|
|000001a0| 72 76 65 43 6f 65 66 66 | 69 63 69 65 6e 74 73 20 |rveCoeff|icients |
|000001b0| 7b 0d 09 64 6f 75 62 6c | 65 20 61 30 2c 20 61 31 |{..doubl|e a0, a1|
|000001c0| 2c 20 61 32 3b 09 2f 2f | 20 78 28 74 29 20 3d 20 |, a2;.//| x(t) = |
|000001d0| 61 30 20 2b 20 74 20 2a | 20 28 61 31 20 2b 20 74 |a0 + t *| (a1 + t|
|000001e0| 20 2a 20 61 32 29 3b 0d | 09 64 6f 75 62 6c 65 20 | * a2);.|.double |
|000001f0| 62 30 2c 20 62 31 2c 20 | 62 32 3b 09 2f 2f 20 79 |b0, b1, |b2;.// y|
|00000200| 28 74 29 20 3d 20 62 30 | 20 2b 20 74 20 2a 20 28 |(t) = b0| + t * (|
|00000210| 62 31 20 2b 20 74 20 2a | 20 62 32 29 3b 0d 09 42 |b1 + t *| b2);..B|
|00000220| 6f 6f 6c 65 61 6e 20 69 | 73 4c 69 6e 65 61 72 3b |oolean i|sLinear;|
|00000230| 09 2f 2f 20 74 72 75 65 | 20 69 66 20 61 6c 6c 20 |.// true| if all |
|00000240| 74 68 72 65 65 20 70 6f | 69 6e 74 73 20 61 72 65 |three po|ints are|
|00000250| 20 63 6f 6c 69 6e 65 61 | 72 2e 0d 7d 3b 0d 74 79 | colinea|r..};.ty|
|00000260| 70 65 64 65 66 20 73 74 | 72 75 63 74 20 43 75 72 |pedef st|ruct Cur|
|00000270| 76 65 43 6f 65 66 66 69 | 63 69 65 6e 74 73 20 43 |veCoeffi|cients C|
|00000280| 75 72 76 65 43 6f 65 66 | 66 69 63 69 65 6e 74 73 |urveCoef|ficients|
|00000290| 2c 20 2a 43 75 72 76 65 | 43 6f 65 66 66 50 74 72 |, *Curve|CoeffPtr|
|000002a0| 3b 0d 0d 0d 2f 2f 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |;...//--|--------|
|000002b0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|000002c0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|000002d0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|000002e0| 2d 2d 2d 2d 2d 2d 2d 2d | 0d 2f 2f 20 41 20 28 31 |--------|.// A (1|
|000002f0| 36 2e 31 36 29 20 46 69 | 78 65 64 20 6e 75 6d 62 |6.16) Fi|xed numb|
|00000300| 65 72 20 69 73 20 61 20 | 33 32 2d 62 69 74 20 6c |er is a |32-bit l|
|00000310| 6f 6e 67 20 69 6e 74 65 | 67 65 72 20 22 6e 22 20 |ong inte|ger "n" |
|00000320| 72 65 70 72 65 73 65 6e | 74 69 6e 67 0d 2f 2f 20 |represen|ting.// |
|00000330| 61 20 64 65 63 69 6d 61 | 6c 20 76 61 6c 75 65 20 |a decima|l value |
|00000340| 6f 66 20 28 6e 20 2f 20 | 36 35 35 33 36 29 2e 0d |of (n / |65536)..|
|00000350| 23 64 65 66 69 6e 65 20 | 6b 46 6c 6f 61 74 54 6f |#define |kFloatTo|
|00000360| 46 69 78 65 64 09 36 35 | 35 33 36 2e 30 0d 0d 23 |Fixed.65|536.0..#|
|00000370| 64 65 66 69 6e 65 20 4d | 55 4c 54 49 50 4c 59 5f |define M|ULTIPLY_|
|00000380| 44 4f 55 42 4c 45 5f 57 | 49 54 48 5f 46 49 58 45 |DOUBLE_W|ITH_FIXE|
|00000390| 44 28 64 2c 20 6e 29 09 | 28 46 69 78 65 64 29 28 |D(d, n).|(Fixed)(|
|000003a0| 28 64 29 20 2a 20 28 64 | 6f 75 62 6c 65 29 28 6e |(d) * (d|ouble)(n|
|000003b0| 29 29 0d 2f 2f 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |)).//---|--------|
|000003c0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|000003d0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|000003e0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|000003f0| 2d 2d 2d 2d 2d 2d 2d 0d | 76 6f 69 64 20 43 75 72 |-------.|void Cur|
|00000400| 76 65 54 6f 4c 69 6e 65 | 28 67 78 43 75 72 76 65 |veToLine|(gxCurve|
|00000410| 20 2a 74 68 65 43 75 72 | 76 65 2c 20 67 78 4c 69 | *theCur|ve, gxLi|
|00000420| 6e 65 20 2a 74 68 65 4c | 69 6e 65 29 3b 0d 76 6f |ne *theL|ine);.vo|
|00000430| 69 64 20 43 75 72 76 65 | 54 6f 4c 69 6e 65 28 67 |id Curve|ToLine(g|
|00000440| 78 43 75 72 76 65 20 2a | 74 68 65 43 75 72 76 65 |xCurve *|theCurve|
|00000450| 2c 20 67 78 4c 69 6e 65 | 20 2a 74 68 65 4c 69 6e |, gxLine| *theLin|
|00000460| 65 29 0d 7b 0d 09 2f 2f | 20 66 75 6e 63 74 69 6f |e).{..//| functio|
|00000470| 6e 20 74 61 6b 65 73 20 | 61 20 63 75 72 76 65 20 |n takes |a curve |
|00000480| 74 68 61 74 20 69 73 20 | 72 65 61 6c 6c 79 20 61 |that is |really a|
|00000490| 20 6c 69 6e 65 20 61 6e | 64 20 6d 61 6b 65 73 20 | line an|d makes |
|000004a0| 61 20 6c 69 6e 65 20 73 | 74 72 75 63 74 75 72 65 |a line s|tructure|
|000004b0| 20 6f 75 74 20 6f 66 0d | 09 2f 2f 20 69 74 2e 20 | out of.|.// it. |
|000004c0| 20 49 74 20 63 68 65 63 | 6b 73 20 74 68 65 20 33 | It chec|ks the 3|
|000004d0| 20 63 6f 6d 62 69 6e 61 | 74 69 6f 6e 73 20 6f 66 | combina|tions of|
|000004e0| 20 74 68 65 20 74 68 72 | 65 65 20 70 6f 69 6e 74 | the thr|ee point|
|000004f0| 73 20 74 6f 20 66 69 6e | 64 20 74 68 65 20 74 77 |s to fin|d the tw|
|00000500| 6f 20 66 75 72 74 68 65 | 73 74 20 61 70 61 72 74 |o furthe|st apart|
|00000510| 0d 09 2f 2f 09 62 65 63 | 61 75 73 65 20 69 74 20 |..//.bec|ause it |
|00000520| 69 73 20 6e 6f 74 20 6e | 65 63 65 73 73 61 72 69 |is not n|ecessari|
|00000530| 6c 79 20 74 68 65 20 66 | 69 72 73 74 20 61 6e 64 |ly the f|irst and|
|00000540| 20 6c 61 73 74 20 70 6f | 69 6e 74 73 2e 0d 09 2f | last po|ints.../|
|00000550| 2f 09 75 73 65 20 64 6f | 75 62 6c 65 73 20 74 6f |/.use do|ubles to|
|00000560| 20 61 76 6f 69 64 20 6f | 76 65 72 66 6c 6f 77 2e | avoid o|verflow.|
|00000570| 20 20 46 75 6e 63 74 69 | 6f 6e 20 61 73 73 75 6d | Functi|on assum|
|00000580| 65 73 20 74 68 65 20 63 | 75 72 76 65 20 77 61 73 |es the c|urve was|
|00000590| 20 61 6c 6c 20 63 6f 6c | 69 6e 65 61 72 20 70 6f | all col|inear po|
|000005a0| 69 6e 74 73 2e 0d 09 64 | 6f 75 62 6c 65 09 09 78 |ints...d|ouble..x|
|000005b0| 31 2c 20 79 31 2c 20 78 | 32 2c 20 79 32 2c 20 78 |1, y1, x|2, y2, x|
|000005c0| 33 2c 20 79 33 3b 0d 09 | 64 6f 75 62 6c 65 09 09 |3, y3;..|double..|
|000005d0| 64 31 2c 20 64 32 2c 20 | 64 33 3b 0d 09 0d 09 78 |d1, d2, |d3;....x|
|000005e0| 31 20 3d 20 74 68 65 43 | 75 72 76 65 2d 3e 66 69 |1 = theC|urve->fi|
|000005f0| 72 73 74 2e 78 20 2f 20 | 6b 46 6c 6f 61 74 54 6f |rst.x / |kFloatTo|
|00000600| 46 69 78 65 64 3b 0d 09 | 79 31 20 3d 20 74 68 65 |Fixed;..|y1 = the|
|00000610| 43 75 72 76 65 2d 3e 66 | 69 72 73 74 2e 79 20 2f |Curve->f|irst.y /|
|00000620| 20 6b 46 6c 6f 61 74 54 | 6f 46 69 78 65 64 3b 0d | kFloatT|oFixed;.|
|00000630| 09 78 32 20 3d 20 74 68 | 65 43 75 72 76 65 2d 3e |.x2 = th|eCurve->|
|00000640| 63 6f 6e 74 72 6f 6c 2e | 78 20 2f 20 6b 46 6c 6f |control.|x / kFlo|
|00000650| 61 74 54 6f 46 69 78 65 | 64 3b 0d 09 79 32 20 3d |atToFixe|d;..y2 =|
|00000660| 20 74 68 65 43 75 72 76 | 65 2d 3e 63 6f 6e 74 72 | theCurv|e->contr|
|00000670| 6f 6c 2e 79 20 2f 20 6b | 46 6c 6f 61 74 54 6f 46 |ol.y / k|FloatToF|
|00000680| 69 78 65 64 3b 0d 09 78 | 33 20 3d 20 74 68 65 43 |ixed;..x|3 = theC|
|00000690| 75 72 76 65 2d 3e 6c 61 | 73 74 2e 78 20 2f 20 6b |urve->la|st.x / k|
|000006a0| 46 6c 6f 61 74 54 6f 46 | 69 78 65 64 3b 0d 09 79 |FloatToF|ixed;..y|
|000006b0| 33 20 3d 20 74 68 65 43 | 75 72 76 65 2d 3e 6c 61 |3 = theC|urve->la|
|000006c0| 73 74 2e 79 20 2f 20 6b | 46 6c 6f 61 74 54 6f 46 |st.y / k|FloatToF|
|000006d0| 69 78 65 64 3b 0d 09 0d | 09 64 31 20 3d 20 28 78 |ixed;...|.d1 = (x|
|000006e0| 32 2d 78 31 29 2a 28 78 | 32 2d 78 31 29 20 2b 20 |2-x1)*(x|2-x1) + |
|000006f0| 28 79 32 2d 79 31 29 2a | 28 79 32 2d 79 31 29 3b |(y2-y1)*|(y2-y1);|
|00000700| 09 09 09 2f 2f 20 6c 69 | 6e 65 3a 20 66 69 72 73 |...// li|ne: firs|
|00000710| 74 2d 63 6f 6e 74 72 6f | 6c 0d 09 64 32 20 3d 20 |t-contro|l..d2 = |
|00000720| 28 78 33 2d 78 31 29 2a | 28 78 33 2d 78 31 29 20 |(x3-x1)*|(x3-x1) |
|00000730| 2b 20 28 79 33 2d 79 31 | 29 2a 28 79 33 2d 79 31 |+ (y3-y1|)*(y3-y1|
|00000740| 29 3b 09 09 09 2f 2f 20 | 6c 69 6e 65 3a 20 66 69 |);...// |line: fi|
|00000750| 72 73 74 2d 6c 61 73 74 | 0d 09 64 33 20 3d 20 28 |rst-last|..d3 = (|
|00000760| 78 33 2d 78 32 29 2a 28 | 78 33 2d 78 32 29 20 2b |x3-x2)*(|x3-x2) +|
|00000770| 20 28 79 33 2d 79 32 29 | 2a 28 79 33 2d 79 32 29 | (y3-y2)|*(y3-y2)|
|00000780| 3b 09 09 09 2f 2f 20 6c | 69 6e 65 3a 20 63 6f 6e |;...// l|ine: con|
|00000790| 74 72 6f 6c 2d 6c 61 73 | 74 0d 09 0d 09 69 66 20 |trol-las|t....if |
|000007a0| 28 20 28 64 31 20 3e 20 | 64 32 29 20 26 26 20 28 |( (d1 > |d2) && (|
|000007b0| 64 31 20 3e 20 64 33 29 | 20 29 20 7b 09 09 2f 2f |d1 > d3)| ) {..//|
|000007c0| 20 64 31 20 6c 6f 6e 67 | 65 73 74 0d 09 0d 09 09 | d1 long|est.....|
|000007d0| 74 68 65 4c 69 6e 65 2d | 3e 66 69 72 73 74 2e 78 |theLine-|>first.x|
|000007e0| 20 3d 20 74 68 65 43 75 | 72 76 65 2d 3e 66 69 72 | = theCu|rve->fir|
|000007f0| 73 74 2e 78 3b 0d 09 09 | 74 68 65 4c 69 6e 65 2d |st.x;...|theLine-|
|00000800| 3e 66 69 72 73 74 2e 79 | 20 3d 20 74 68 65 43 75 |>first.y| = theCu|
|00000810| 72 76 65 2d 3e 66 69 72 | 73 74 2e 79 3b 0d 09 09 |rve->fir|st.y;...|
|00000820| 74 68 65 4c 69 6e 65 2d | 3e 6c 61 73 74 2e 78 20 |theLine-|>last.x |
|00000830| 3d 20 74 68 65 43 75 72 | 76 65 2d 3e 63 6f 6e 74 |= theCur|ve->cont|
|00000840| 72 6f 6c 2e 78 3b 0d 09 | 09 74 68 65 4c 69 6e 65 |rol.x;..|.theLine|
|00000850| 2d 3e 6c 61 73 74 2e 79 | 20 3d 20 74 68 65 43 75 |->last.y| = theCu|
|00000860| 72 76 65 2d 3e 63 6f 6e | 74 72 6f 6c 2e 79 3b 0d |rve->con|trol.y;.|
|00000870| 09 0d 09 7d 20 65 6c 73 | 65 20 69 66 20 28 20 28 |...} els|e if ( (|
|00000880| 64 32 20 3e 20 64 31 29 | 20 26 26 20 28 64 32 20 |d2 > d1)| && (d2 |
|00000890| 3e 20 64 33 29 20 29 20 | 7b 09 2f 2f 20 64 32 20 |> d3) ) |{.// d2 |
|000008a0| 6c 6f 6e 67 65 73 74 0d | 09 0d 09 09 74 68 65 4c |longest.|....theL|
|000008b0| 69 6e 65 2d 3e 66 69 72 | 73 74 2e 78 20 3d 20 74 |ine->fir|st.x = t|
|000008c0| 68 65 43 75 72 76 65 2d | 3e 66 69 72 73 74 2e 78 |heCurve-|>first.x|
|000008d0| 3b 0d 09 09 74 68 65 4c | 69 6e 65 2d 3e 66 69 72 |;...theL|ine->fir|
|000008e0| 73 74 2e 79 20 3d 20 74 | 68 65 43 75 72 76 65 2d |st.y = t|heCurve-|
|000008f0| 3e 66 69 72 73 74 2e 79 | 3b 0d 09 09 74 68 65 4c |>first.y|;...theL|
|00000900| 69 6e 65 2d 3e 6c 61 73 | 74 2e 78 20 3d 20 74 68 |ine->las|t.x = th|
|00000910| 65 43 75 72 76 65 2d 3e | 6c 61 73 74 2e 78 3b 0d |eCurve->|last.x;.|
|00000920| 09 09 74 68 65 4c 69 6e | 65 2d 3e 6c 61 73 74 2e |..theLin|e->last.|
|00000930| 79 20 3d 20 74 68 65 43 | 75 72 76 65 2d 3e 6c 61 |y = theC|urve->la|
|00000940| 73 74 2e 79 3b 0d 09 0d | 09 7d 20 65 6c 73 65 20 |st.y;...|.} else |
|00000950| 7b 20 20 2f 2f 20 64 33 | 20 6d 75 73 74 20 62 65 |{ // d3| must be|
|00000960| 20 6c 6f 6e 67 65 73 74 | 0d 09 0d 09 09 74 68 65 | longest|.....the|
|00000970| 4c 69 6e 65 2d 3e 66 69 | 72 73 74 2e 78 20 3d 20 |Line->fi|rst.x = |
|00000980| 74 68 65 43 75 72 76 65 | 2d 3e 63 6f 6e 74 72 6f |theCurve|->contro|
|00000990| 6c 2e 78 3b 0d 09 09 74 | 68 65 4c 69 6e 65 2d 3e |l.x;...t|heLine->|
|000009a0| 66 69 72 73 74 2e 79 20 | 3d 20 74 68 65 43 75 72 |first.y |= theCur|
|000009b0| 76 65 2d 3e 63 6f 6e 74 | 72 6f 6c 2e 79 3b 0d 09 |ve->cont|rol.y;..|
|000009c0| 09 74 68 65 4c 69 6e 65 | 2d 3e 6c 61 73 74 2e 78 |.theLine|->last.x|
|000009d0| 20 3d 20 74 68 65 43 75 | 72 76 65 2d 3e 6c 61 73 | = theCu|rve->las|
|000009e0| 74 2e 78 3b 0d 09 09 74 | 68 65 4c 69 6e 65 2d 3e |t.x;...t|heLine->|
|000009f0| 6c 61 73 74 2e 79 20 3d | 20 74 68 65 43 75 72 76 |last.y =| theCurv|
|00000a00| 65 2d 3e 6c 61 73 74 2e | 79 3b 0d 09 0d 09 7d 2f |e->last.|y;....}/|
|00000a10| 2f 65 6e 64 20 69 66 0d | 09 0d 7d 0d 0d 2f 2f 2d |/end if.|..}..//-|
|00000a20| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00000a30| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00000a40| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00000a50| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00000a60| 2d 0d 2f 2f 20 43 61 6e | 20 79 6f 75 20 73 61 79 |-.// Can| you say|
|00000a70| 20 22 50 79 74 68 61 67 | 6f 72 65 22 3f 0d 2f 2f | "Pythag|ore"?.//|
|00000a80| 20 57 65 20 63 6f 6e 76 | 65 72 74 20 74 6f 20 66 | We conv|ert to f|
|00000a90| 6c 6f 61 74 69 6e 67 20 | 70 6f 69 6e 74 20 66 6f |loating |point fo|
|00000aa0| 72 20 6d 6f 72 65 20 72 | 6f 6f 6d 20 74 6f 20 62 |r more r|oom to b|
|00000ab0| 72 65 61 74 68 65 20 77 | 69 74 68 20 74 68 65 0d |reathe w|ith the.|
|00000ac0| 2f 2f 20 73 71 75 61 72 | 65 73 2c 20 61 6e 64 20 |// squar|es, and |
|00000ad0| 66 6f 72 20 74 68 65 20 | 63 6f 6e 76 65 6e 69 65 |for the |convenie|
|00000ae0| 6e 63 65 20 6f 66 20 73 | 71 72 74 28 29 2e 0d 64 |nce of s|qrt()..d|
|00000af0| 6f 75 62 6c 65 20 47 65 | 74 4c 69 6e 65 4c 65 6e |ouble Ge|tLineLen|
|00000b00| 67 74 68 28 67 78 4c 69 | 6e 65 20 2a 74 68 65 4c |gth(gxLi|ne *theL|
|00000b10| 69 6e 65 29 0d 7b 0d 09 | 64 6f 75 62 6c 65 20 61 |ine).{..|double a|
|00000b20| 20 3d 20 28 74 68 65 4c | 69 6e 65 2d 3e 6c 61 73 | = (theL|ine->las|
|00000b30| 74 2e 78 20 2d 20 74 68 | 65 4c 69 6e 65 2d 3e 66 |t.x - th|eLine->f|
|00000b40| 69 72 73 74 2e 78 29 20 | 2f 20 6b 46 6c 6f 61 74 |irst.x) |/ kFloat|
|00000b50| 54 6f 46 69 78 65 64 3b | 0d 09 64 6f 75 62 6c 65 |ToFixed;|..double|
|00000b60| 20 62 20 3d 20 28 74 68 | 65 4c 69 6e 65 2d 3e 6c | b = (th|eLine->l|
|00000b70| 61 73 74 2e 79 20 2d 20 | 74 68 65 4c 69 6e 65 2d |ast.y - |theLine-|
|00000b80| 3e 66 69 72 73 74 2e 79 | 29 20 2f 20 6b 46 6c 6f |>first.y|) / kFlo|
|00000b90| 61 74 54 6f 46 69 78 65 | 64 3b 0d 09 72 65 74 75 |atToFixe|d;..retu|
|00000ba0| 72 6e 20 73 71 72 74 28 | 61 20 2a 20 61 20 2b 20 |rn sqrt(|a * a + |
|00000bb0| 62 20 2a 20 62 29 3b 0d | 7d 0d 0d 0d 2f 2f 2d 2d |b * b);.|}...//--|
|00000bc0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00000bd0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00000be0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00000bf0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00000c00| 0d 2f 2f 20 22 74 68 65 | 4c 65 6e 67 74 68 22 20 |.// "the|Length" |
|00000c10| 63 61 6e 20 62 65 20 61 | 6e 79 20 46 69 78 65 64 |can be a|ny Fixed|
|00000c20| 20 6e 75 6d 62 65 72 20 | 69 6e 20 74 68 65 20 72 | number |in the r|
|00000c30| 61 6e 67 65 20 30 78 38 | 30 30 30 30 30 30 30 20 |ange 0x8|0000000 |
|00000c40| 2e 2e 2e 20 30 78 37 46 | 46 46 46 46 46 46 0d 2f |... 0x7F|FFFFFF./|
|00000c50| 2f 20 22 74 68 65 54 61 | 6e 67 65 6e 74 22 20 61 |/ "theTa|ngent" a|
|00000c60| 6c 77 61 79 73 20 69 73 | 20 74 68 65 20 76 65 63 |lways is| the vec|
|00000c70| 74 6f 72 20 64 65 66 69 | 6e 65 64 20 62 79 20 74 |tor defi|ned by t|
|00000c80| 68 65 4c 69 6e 65 2d 3e | 66 69 72 73 74 20 2e 2e |heLine->|first ..|
|00000c90| 2e 20 74 68 65 4c 69 6e | 65 2d 3e 6c 61 73 74 2e |. theLin|e->last.|
|00000ca0| 0d 76 6f 69 64 20 20 4c | 69 6e 65 4c 65 6e 67 74 |.void L|ineLengt|
|00000cb0| 68 54 6f 50 6f 69 6e 74 | 28 64 6f 75 62 6c 65 20 |hToPoint|(double |
|00000cc0| 74 68 65 4c 65 6e 67 74 | 68 2c 20 67 78 4c 69 6e |theLengt|h, gxLin|
|00000cd0| 65 20 2a 74 68 65 4c 69 | 6e 65 2c 20 67 78 50 6f |e *theLi|ne, gxPo|
|00000ce0| 69 6e 74 20 2a 74 68 65 | 50 6f 69 6e 74 2c 20 67 |int *the|Point, g|
|00000cf0| 78 50 6f 69 6e 74 20 2a | 74 68 65 54 61 6e 67 65 |xPoint *|theTange|
|00000d00| 6e 74 29 0d 7b 0d 09 64 | 6f 75 62 6c 65 20 74 6f |nt).{..d|ouble to|
|00000d10| 74 61 6c 6c 65 6e 67 74 | 68 20 3d 20 47 65 74 4c |tallengt|h = GetL|
|00000d20| 69 6e 65 4c 65 6e 67 74 | 68 28 74 68 65 4c 69 6e |ineLengt|h(theLin|
|00000d30| 65 29 3b 0d 09 64 6f 75 | 62 6c 65 20 74 3b 0d 09 |e);..dou|ble t;..|
|00000d40| 46 69 78 65 64 20 20 64 | 78 2c 20 64 79 3b 0d 09 |Fixed d|x, dy;..|
|00000d50| 0d 09 69 66 20 28 74 6f | 74 61 6c 6c 65 6e 67 74 |..if (to|tallengt|
|00000d60| 68 20 21 3d 20 30 2e 30 | 29 0d 09 09 74 20 3d 20 |h != 0.0|)...t = |
|00000d70| 74 68 65 4c 65 6e 67 74 | 68 20 2f 20 74 6f 74 61 |theLengt|h / tota|
|00000d80| 6c 6c 65 6e 67 74 68 3b | 0d 09 65 6c 73 65 0d 09 |llength;|..else..|
|00000d90| 09 74 20 3d 20 30 2e 30 | 3b 0d 09 0d 09 64 78 20 |.t = 0.0|;....dx |
|00000da0| 3d 20 74 68 65 4c 69 6e | 65 2d 3e 6c 61 73 74 2e |= theLin|e->last.|
|00000db0| 78 20 2d 20 74 68 65 4c | 69 6e 65 2d 3e 66 69 72 |x - theL|ine->fir|
|00000dc0| 73 74 2e 78 3b 0d 09 64 | 79 20 20 3d 20 74 68 65 |st.x;..d|y = the|
|00000dd0| 4c 69 6e 65 2d 3e 6c 61 | 73 74 2e 79 20 2d 20 74 |Line->la|st.y - t|
|00000de0| 68 65 4c 69 6e 65 2d 3e | 66 69 72 73 74 2e 79 3b |heLine->|first.y;|
|00000df0| 0d 09 0d 09 69 66 20 28 | 74 68 65 50 6f 69 6e 74 |....if (|thePoint|
|00000e00| 29 20 7b 0d 09 09 74 68 | 65 50 6f 69 6e 74 2d 3e |) {...th|ePoint->|
|00000e10| 78 20 3d 20 74 68 65 4c | 69 6e 65 2d 3e 66 69 72 |x = theL|ine->fir|
|00000e20| 73 74 2e 78 20 2b 20 4d | 55 4c 54 49 50 4c 59 5f |st.x + M|ULTIPLY_|
|00000e30| 44 4f 55 42 4c 45 5f 57 | 49 54 48 5f 46 49 58 45 |DOUBLE_W|ITH_FIXE|
|00000e40| 44 28 74 2c 20 64 78 29 | 3b 0d 09 09 74 68 65 50 |D(t, dx)|;...theP|
|00000e50| 6f 69 6e 74 2d 3e 79 20 | 3d 20 74 68 65 4c 69 6e |oint->y |= theLin|
|00000e60| 65 2d 3e 66 69 72 73 74 | 2e 79 20 2b 20 4d 55 4c |e->first|.y + MUL|
|00000e70| 54 49 50 4c 59 5f 44 4f | 55 42 4c 45 5f 57 49 54 |TIPLY_DO|UBLE_WIT|
|00000e80| 48 5f 46 49 58 45 44 28 | 74 2c 20 64 79 29 3b 0d |H_FIXED(|t, dy);.|
|00000e90| 09 7d 0d 09 0d 09 2f 2a | 20 6e 6f 77 20 6e 6f 72 |.}..../*| now nor|
|00000ea0| 6d 61 6c 69 7a 65 20 74 | 68 65 20 74 61 6e 67 65 |malize t|he tange|
|00000eb0| 6e 74 20 2a 2f 0d 09 0d | 09 69 66 20 28 74 68 65 |nt */...|.if (the|
|00000ec0| 54 61 6e 67 65 6e 74 20 | 26 26 20 28 74 6f 74 61 |Tangent |&& (tota|
|00000ed0| 6c 6c 65 6e 67 74 68 20 | 21 3d 20 30 2e 30 29 29 |llength |!= 0.0))|
|00000ee0| 20 7b 0d 09 09 74 68 65 | 54 61 6e 67 65 6e 74 2d | {...the|Tangent-|
|00000ef0| 3e 78 20 3d 20 46 69 78 | 65 64 44 69 76 69 64 65 |>x = Fix|edDivide|
|00000f00| 28 20 64 78 2c 20 28 46 | 69 78 65 64 29 28 74 6f |( dx, (F|ixed)(to|
|00000f10| 74 61 6c 6c 65 6e 67 74 | 68 20 2a 20 6b 46 6c 6f |tallengt|h * kFlo|
|00000f20| 61 74 54 6f 46 69 78 65 | 64 29 29 3b 0d 09 09 74 |atToFixe|d));...t|
|00000f30| 68 65 54 61 6e 67 65 6e | 74 2d 3e 79 20 3d 20 46 |heTangen|t->y = F|
|00000f40| 69 78 65 64 44 69 76 69 | 64 65 28 20 64 79 2c 20 |ixedDivi|de( dy, |
|00000f50| 28 46 69 78 65 64 29 28 | 74 6f 74 61 6c 6c 65 6e |(Fixed)(|totallen|
|00000f60| 67 74 68 20 2a 20 6b 46 | 6c 6f 61 74 54 6f 46 69 |gth * kF|loatToFi|
|00000f70| 78 65 64 29 29 3b 0d 09 | 7d 2f 2f 65 6e 64 20 69 |xed));..|}//end i|
|00000f80| 66 0d 7d 0d 0d 0d 2f 2f | 2d 2d 2d 2d 2d 2d 2d 2d |f.}...//|--------|
|00000f90| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00000fa0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00000fb0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00000fc0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 0d 2f 2f 20 54 68 |--------|--.// Th|
|00000fd0| 65 20 63 6f 6e 64 69 74 | 69 6f 6e 73 20 28 78 28 |e condit|ions (x(|
|00000fe0| 30 29 2c 20 79 28 30 29 | 29 20 3d 20 74 68 65 43 |0), y(0)|) = theC|
|00000ff0| 75 72 76 65 2d 3e 66 69 | 72 73 74 2c 20 28 78 28 |urve->fi|rst, (x(|
|00001000| 31 29 2c 20 79 28 31 29 | 29 20 3d 20 74 68 65 43 |1), y(1)|) = theC|
|00001010| 75 72 76 65 2d 3e 6c 61 | 73 74 2c 0d 2f 2f 20 28 |urve->la|st,.// (|
|00001020| 78 27 28 30 29 2c 20 79 | 27 28 30 29 29 20 3d 20 |x'(0), y|'(0)) = |
|00001030| 74 68 65 43 75 72 76 65 | 2d 3e 63 6f 6e 74 72 6f |theCurve|->contro|
|00001040| 6c 20 2d 20 74 68 65 43 | 75 72 76 65 2d 3e 66 69 |l - theC|urve->fi|
|00001050| 72 73 74 20 28 74 61 6e | 67 65 6e 74 20 61 74 20 |rst (tan|gent at |
|00001060| 22 66 69 72 73 74 22 29 | 0d 2f 2f 20 28 78 27 28 |"first")|.// (x'(|
|00001070| 31 29 2c 20 79 27 28 31 | 29 29 20 3d 20 74 68 65 |1), y'(1|)) = the|
|00001080| 43 75 72 76 65 2d 3e 6c | 61 73 74 20 2d 20 74 68 |Curve->l|ast - th|
|00001090| 65 43 75 72 76 65 2d 3e | 63 6f 6e 74 72 6f 6c 20 |eCurve->|control |
|000010a0| 28 74 61 6e 67 65 6e 74 | 20 61 74 20 22 6c 61 73 |(tangent| at "las|
|000010b0| 74 22 29 0d 2f 2f 20 61 | 72 65 20 73 75 66 66 69 |t").// a|re suffi|
|000010c0| 63 69 65 6e 74 20 74 6f | 20 64 65 74 65 72 6d 69 |cient to| determi|
|000010d0| 6e 65 20 74 68 65 20 63 | 6f 65 66 66 69 63 69 65 |ne the c|oefficie|
|000010e0| 6e 74 73 20 6f 66 20 74 | 68 65 20 71 75 61 64 72 |nts of t|he quadr|
|000010f0| 61 74 69 63 20 70 61 72 | 61 6d 65 74 72 69 7a 61 |atic par|ametriza|
|00001100| 74 69 6f 6e 2e 0d 73 74 | 61 74 69 63 20 76 6f 69 |tion..st|atic voi|
|00001110| 64 20 43 6f 6d 70 75 74 | 65 43 75 72 76 65 43 6f |d Comput|eCurveCo|
|00001120| 65 66 66 69 63 69 65 6e | 74 73 28 67 78 43 75 72 |efficien|ts(gxCur|
|00001130| 76 65 20 2a 74 68 65 43 | 75 72 76 65 2c 20 43 75 |ve *theC|urve, Cu|
|00001140| 72 76 65 43 6f 65 66 66 | 69 63 69 65 6e 74 73 2a |rveCoeff|icients*|
|00001150| 20 63 63 29 0d 7b 0d 09 | 64 6f 75 62 6c 65 20 66 | cc).{..|double f|
|00001160| 69 78 65 64 54 6f 46 6c | 6f 61 74 20 3d 20 31 20 |ixedToFl|oat = 1 |
|00001170| 2f 20 6b 46 6c 6f 61 74 | 54 6f 46 69 78 65 64 3b |/ kFloat|ToFixed;|
|00001180| 0d 09 0d 09 63 63 2d 3e | 61 30 20 3d 20 66 69 78 |....cc->|a0 = fix|
|00001190| 65 64 54 6f 46 6c 6f 61 | 74 20 2a 20 74 68 65 43 |edToFloa|t * theC|
|000011a0| 75 72 76 65 2d 3e 66 69 | 72 73 74 2e 78 3b 0d 09 |urve->fi|rst.x;..|
|000011b0| 63 63 2d 3e 61 31 20 3d | 20 66 69 78 65 64 54 6f |cc->a1 =| fixedTo|
|000011c0| 46 6c 6f 61 74 20 2a 20 | 28 28 74 68 65 43 75 72 |Float * |((theCur|
|000011d0| 76 65 2d 3e 63 6f 6e 74 | 72 6f 6c 2e 78 20 2d 20 |ve->cont|rol.x - |
|000011e0| 74 68 65 43 75 72 76 65 | 2d 3e 66 69 72 73 74 2e |theCurve|->first.|
|000011f0| 78 29 20 3c 3c 20 31 29 | 3b 0d 09 63 63 2d 3e 61 |x) << 1)|;..cc->a|
|00001200| 32 20 3d 20 66 69 78 65 | 64 54 6f 46 6c 6f 61 74 |2 = fixe|dToFloat|
|00001210| 20 2a 20 28 74 68 65 43 | 75 72 76 65 2d 3e 6c 61 | * (theC|urve->la|
|00001220| 73 74 2e 78 20 2d 20 28 | 74 68 65 43 75 72 76 65 |st.x - (|theCurve|
|00001230| 2d 3e 63 6f 6e 74 72 6f | 6c 2e 78 20 3c 3c 20 31 |->contro|l.x << 1|
|00001240| 29 20 2b 20 74 68 65 43 | 75 72 76 65 2d 3e 66 69 |) + theC|urve->fi|
|00001250| 72 73 74 2e 78 29 3b 0d | 0d 09 63 63 2d 3e 62 30 |rst.x);.|..cc->b0|
|00001260| 20 3d 20 66 69 78 65 64 | 54 6f 46 6c 6f 61 74 20 | = fixed|ToFloat |
|00001270| 2a 20 74 68 65 43 75 72 | 76 65 2d 3e 66 69 72 73 |* theCur|ve->firs|
|00001280| 74 2e 79 3b 0d 09 63 63 | 2d 3e 62 31 20 3d 20 66 |t.y;..cc|->b1 = f|
|00001290| 69 78 65 64 54 6f 46 6c | 6f 61 74 20 2a 20 28 28 |ixedToFl|oat * ((|
|000012a0| 74 68 65 43 75 72 76 65 | 2d 3e 63 6f 6e 74 72 6f |theCurve|->contro|
|000012b0| 6c 2e 79 20 2d 20 74 68 | 65 43 75 72 76 65 2d 3e |l.y - th|eCurve->|
|000012c0| 66 69 72 73 74 2e 79 29 | 20 3c 3c 20 31 29 3b 0d |first.y)| << 1);.|
|000012d0| 09 63 63 2d 3e 62 32 20 | 3d 20 66 69 78 65 64 54 |.cc->b2 |= fixedT|
|000012e0| 6f 46 6c 6f 61 74 20 2a | 20 28 74 68 65 43 75 72 |oFloat *| (theCur|
|000012f0| 76 65 2d 3e 6c 61 73 74 | 2e 79 20 2d 20 28 74 68 |ve->last|.y - (th|
|00001300| 65 43 75 72 76 65 2d 3e | 63 6f 6e 74 72 6f 6c 2e |eCurve->|control.|
|00001310| 79 20 3c 3c 20 31 29 20 | 2b 20 74 68 65 43 75 72 |y << 1) |+ theCur|
|00001320| 76 65 2d 3e 66 69 72 73 | 74 2e 79 29 3b 0d 09 0d |ve->firs|t.y);...|
|00001330| 09 63 63 2d 3e 69 73 4c | 69 6e 65 61 72 20 3d 20 |.cc->isL|inear = |
|00001340| 28 20 63 63 2d 3e 61 32 | 20 3d 3d 20 30 2e 30 20 |( cc->a2| == 0.0 |
|00001350| 29 20 26 26 20 28 63 63 | 2d 3e 62 32 20 3d 3d 20 |) && (cc|->b2 == |
|00001360| 30 2e 30 29 20 3f 20 74 | 72 75 65 20 3a 20 66 61 |0.0) ? t|rue : fa|
|00001370| 6c 73 65 3b 0d 7d 0d 0d | 0d 2f 2f 2d 2d 2d 2d 2d |lse;.}..|.//-----|
|00001380| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00001390| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|000013a0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|000013b0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 0d 2f 2f |--------|-----.//|
|000013c0| 20 54 68 61 74 27 73 20 | 74 68 65 20 69 6e 74 65 | That's |the inte|
|000013d0| 67 72 61 6e 64 20 73 71 | 72 74 28 78 27 28 74 29 |grand sq|rt(x'(t)|
|000013e0| 5e 32 20 2b 20 79 27 28 | 74 29 5e 32 29 20 28 69 |^2 + y'(|t)^2) (i|
|000013f0| 66 20 79 6f 75 20 6c 6f | 6f 6b 20 63 6c 6f 73 65 |f you lo|ok close|
|00001400| 6c 79 29 0d 73 74 61 74 | 69 63 20 64 6f 75 62 6c |ly).stat|ic doubl|
|00001410| 65 20 4c 65 6e 67 74 68 | 46 75 6e 63 74 69 6f 6e |e Length|Function|
|00001420| 28 43 75 72 76 65 43 6f | 65 66 66 69 63 69 65 6e |(CurveCo|efficien|
|00001430| 74 73 2a 20 63 63 2c 20 | 64 6f 75 62 6c 65 20 74 |ts* cc, |double t|
|00001440| 29 0d 7b 0d 09 64 6f 75 | 62 6c 65 20 41 20 3d 20 |).{..dou|ble A = |
|00001450| 34 20 2a 20 28 28 63 63 | 2d 3e 61 32 20 2a 20 63 |4 * ((cc|->a2 * c|
|00001460| 63 2d 3e 61 32 29 20 2b | 20 28 63 63 2d 3e 62 32 |c->a2) +| (cc->b2|
|00001470| 20 2a 20 63 63 2d 3e 62 | 32 29 29 3b 0d 09 64 6f | * cc->b|2));..do|
|00001480| 75 62 6c 65 20 42 20 3d | 20 34 20 2a 20 28 28 63 |uble B =| 4 * ((c|
|00001490| 63 2d 3e 61 31 20 2a 20 | 63 63 2d 3e 61 32 29 20 |c->a1 * |cc->a2) |
|000014a0| 2b 20 28 63 63 2d 3e 62 | 31 20 2a 20 63 63 2d 3e |+ (cc->b|1 * cc->|
|000014b0| 62 32 29 29 3b 0d 09 64 | 6f 75 62 6c 65 20 43 20 |b2));..d|ouble C |
|000014c0| 3d 20 28 63 63 2d 3e 61 | 31 20 2a 20 63 63 2d 3e |= (cc->a|1 * cc->|
|000014d0| 61 31 29 20 2b 20 28 63 | 63 2d 3e 62 31 20 2a 20 |a1) + (c|c->b1 * |
|000014e0| 63 63 2d 3e 62 31 29 3b | 0d 0d 09 72 65 74 75 72 |cc->b1);|...retur|
|000014f0| 6e 20 73 71 72 74 28 43 | 20 2b 20 74 20 2a 20 28 |n sqrt(C| + t * (|
|00001500| 42 20 2b 20 74 20 2a 20 | 41 29 29 3b 0d 7d 0d 0d |B + t * |A));.}..|
|00001510| 0d 2f 2f 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |.//-----|--------|
|00001520| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00001530| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00001540| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00001550| 2d 2d 2d 2d 2d 0d 2f 2f | 20 41 66 74 65 72 20 61 |-----.//| After a|
|00001560| 6c 6c 2c 20 74 68 69 73 | 20 69 73 20 74 68 65 20 |ll, this| is the |
|00001570| 6d 6f 73 74 20 61 70 70 | 72 6f 70 72 69 61 74 65 |most app|ropriate|
|00001580| 20 73 6f 6c 75 74 69 6f | 6e 3a 0d 2f 2f 20 55 73 | solutio|n:.// Us|
|00001590| 65 20 74 68 65 20 63 6c | 6f 73 65 64 20 66 6f 72 |e the cl|osed for|
|000015a0| 6d 75 6c 61 20 66 6f 72 | 20 74 68 65 20 6c 65 6e |mula for| the len|
|000015b0| 67 74 68 20 69 6e 74 65 | 67 72 61 6c 21 0d 2f 2f |gth inte|gral!.//|
|000015c0| 20 28 4d 61 74 68 65 6d | 61 74 69 63 61 20 64 69 | (Mathem|atica di|
|000015d0| 64 20 69 74 20 66 6f 72 | 20 6d 65 20 2e 2e 2e 29 |d it for| me ...)|
|000015e0| 0d 73 74 61 74 69 63 20 | 64 6f 75 62 6c 65 20 45 |.static |double E|
|000015f0| 76 61 6c 75 61 74 65 43 | 6c 6f 73 65 64 46 6f 72 |valuateC|losedFor|
|00001600| 6d 75 6c 61 28 43 75 72 | 76 65 43 6f 65 66 66 69 |mula(Cur|veCoeffi|
|00001610| 63 69 65 6e 74 73 2a 20 | 63 63 2c 20 64 6f 75 62 |cients* |cc, doub|
|00001620| 6c 65 20 78 29 0d 7b 0d | 09 64 6f 75 62 6c 65 20 |le x).{.|.double |
|00001630| 41 2c 20 42 2c 20 43 2c | 20 53 43 2c 20 53 43 42 |A, B, C,| SC, SCB|
|00001640| 58 2c 20 72 65 73 75 6c | 74 3b 0d 09 0d 09 41 20 |X, resul|t;....A |
|00001650| 3d 20 34 20 2a 20 28 28 | 63 63 2d 3e 61 32 20 2a |= 4 * ((|cc->a2 *|
|00001660| 20 63 63 2d 3e 61 32 29 | 20 2b 20 28 63 63 2d 3e | cc->a2)| + (cc->|
|00001670| 62 32 20 2a 20 63 63 2d | 3e 62 32 29 29 3b 09 2f |b2 * cc-|>b2));./|
|00001680| 2f 20 73 68 6f 75 6c 64 | 20 61 6c 77 61 79 73 20 |/ should| always |
|00001690| 62 65 20 3e 20 30 0d 09 | 69 66 20 28 41 20 3d 3d |be > 0..|if (A ==|
|000016a0| 20 30 2e 30 29 0d 09 09 | 7b 0d 09 09 44 65 62 75 | 0.0)...|{...Debu|
|000016b0| 67 53 74 72 28 22 5c 70 | 43 75 72 76 65 20 6e 6f |gStr("\p|Curve no|
|000016c0| 74 20 71 75 61 64 72 61 | 74 69 63 22 29 3b 0d 09 |t quadra|tic");..|
|000016d0| 09 72 65 74 75 72 6e 20 | 30 3b 0d 09 09 7d 0d 09 |.return |0;...}..|
|000016e0| 42 20 3d 20 34 20 2a 20 | 28 28 63 63 2d 3e 61 31 |B = 4 * |((cc->a1|
|000016f0| 20 2a 20 63 63 2d 3e 61 | 32 29 20 2b 20 28 63 63 | * cc->a|2) + (cc|
|00001700| 2d 3e 62 31 20 2a 20 63 | 63 2d 3e 62 32 29 29 20 |->b1 * c|c->b2)) |
|00001710| 2f 20 41 3b 0d 09 43 20 | 3d 20 28 28 63 63 2d 3e |/ A;..C |= ((cc->|
|00001720| 61 31 20 2a 20 63 63 2d | 3e 61 31 29 20 2b 20 28 |a1 * cc-|>a1) + (|
|00001730| 63 63 2d 3e 62 31 20 2a | 20 63 63 2d 3e 62 31 29 |cc->b1 *| cc->b1)|
|00001740| 29 20 2f 20 41 3b 0d 09 | 53 43 20 3d 20 73 71 72 |) / A;..|SC = sqr|
|00001750| 74 28 43 29 3b 0d 09 53 | 43 42 58 20 3d 20 73 71 |t(C);..S|CBX = sq|
|00001760| 72 74 28 43 20 2b 20 78 | 20 2a 20 28 42 20 2b 20 |rt(C + x| * (B + |
|00001770| 78 29 29 3b 0d 09 72 65 | 73 75 6c 74 20 3d 20 34 |x));..re|sult = 4|
|00001780| 2e 30 20 2a 20 78 20 2a | 20 53 43 42 58 20 2d 20 |.0 * x *| SCBX - |
|00001790| 32 2e 30 20 2a 20 42 20 | 2a 20 28 53 43 20 2d 20 |2.0 * B |* (SC - |
|000017a0| 53 43 42 58 29 3b 0d 09 | 72 65 73 75 6c 74 20 3d |SCBX);..|result =|
|000017b0| 20 72 65 73 75 6c 74 20 | 2b 20 28 42 20 2a 20 42 | result |+ (B * B|
|000017c0| 20 2d 20 34 2e 30 20 2a | 20 43 29 20 2a 20 28 6c | - 4.0 *| C) * (l|
|000017d0| 6f 67 28 30 2e 35 20 2a | 20 42 20 2b 20 53 43 29 |og(0.5 *| B + SC)|
|000017e0| 20 2d 20 6c 6f 67 28 30 | 2e 35 20 2a 20 42 20 2b | - log(0|.5 * B +|
|000017f0| 20 78 20 2b 20 53 43 42 | 58 29 29 3b 0d 09 72 65 | x + SCB|X));..re|
|00001800| 73 75 6c 74 20 3d 20 73 | 71 72 74 28 41 29 20 2a |sult = s|qrt(A) *|
|00001810| 20 72 65 73 75 6c 74 20 | 2f 20 38 2e 30 3b 20 20 | result |/ 8.0; |
|00001820| 0d 09 72 65 74 75 72 6e | 20 72 65 73 75 6c 74 3b |..return| result;|
|00001830| 0d 7d 0d 0d 0d 2f 2f 2d | 2d 2d 2d 2d 2d 2d 2d 2d |.}...//-|--------|
|00001840| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00001850| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00001860| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00001870| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 0d 73 74 61 74 69 63 |--------|-.static|
|00001880| 20 64 6f 75 62 6c 65 20 | 4e 65 77 4c 65 6e 67 74 | double |NewLengt|
|00001890| 68 54 6f 50 61 72 61 6d | 65 74 65 72 46 75 6e 63 |hToParam|eterFunc|
|000018a0| 74 69 6f 6e 28 43 75 72 | 76 65 43 6f 65 66 66 69 |tion(Cur|veCoeffi|
|000018b0| 63 69 65 6e 74 73 2a 20 | 63 63 2c 20 64 6f 75 62 |cients* |cc, doub|
|000018c0| 6c 65 20 73 29 0d 7b 0d | 09 64 6f 75 62 6c 65 20 |le s).{.|.double |
|000018d0| 61 20 3d 20 30 2e 30 3b | 0d 09 64 6f 75 62 6c 65 |a = 0.0;|..double|
|000018e0| 20 62 20 3d 20 31 2e 30 | 3b 0d 09 64 6f 75 62 6c | b = 1.0|;..doubl|
|000018f0| 65 20 63 2c 20 64 3b 0d | 09 0d 09 2f 2f 20 63 6f |e c, d;.|...// co|
|00001900| 75 6c 64 20 73 65 74 20 | 65 72 72 6f 72 20 69 66 |uld set |error if|
|00001910| 20 73 20 69 73 20 22 6f | 75 74 20 6f 66 20 72 61 | s is "o|ut of ra|
|00001920| 6e 67 65 22 0d 09 0d 09 | 69 66 20 28 73 20 3c 3d |nge"....|if (s <=|
|00001930| 20 30 2e 30 29 0d 09 09 | 72 65 74 75 72 6e 20 30 | 0.0)...|return 0|
|00001940| 2e 30 3b 0d 09 69 66 20 | 28 73 20 3e 3d 20 45 76 |.0;..if |(s >= Ev|
|00001950| 61 6c 75 61 74 65 43 6c | 6f 73 65 64 46 6f 72 6d |aluateCl|osedForm|
|00001960| 75 6c 61 28 63 63 2c 20 | 31 2e 30 29 29 0d 09 09 |ula(cc, |1.0))...|
|00001970| 72 65 74 75 72 6e 20 31 | 2e 30 3b 0d 09 09 0d 09 |return 1|.0;.....|
|00001980| 64 6f 09 7b 0d 09 09 63 | 20 3d 20 30 2e 35 20 2a |do.{...c| = 0.5 *|
|00001990| 20 28 61 20 2b 20 62 29 | 3b 0d 09 09 64 20 3d 20 | (a + b)|;...d = |
|000019a0| 73 20 2d 20 45 76 61 6c | 75 61 74 65 43 6c 6f 73 |s - Eval|uateClos|
|000019b0| 65 64 46 6f 72 6d 75 6c | 61 28 63 63 2c 20 63 29 |edFormul|a(cc, c)|
|000019c0| 3b 0d 09 09 69 66 20 28 | 64 20 3c 20 30 29 09 2f |;...if (|d < 0)./|
|000019d0| 2f 20 63 20 74 6f 6f 20 | 66 61 72 20 72 69 67 68 |/ c too |far righ|
|000019e0| 74 0d 09 09 09 62 20 3d | 20 63 3b 0d 09 09 65 6c |t....b =| c;...el|
|000019f0| 73 65 09 09 2f 2f 20 63 | 20 74 6f 6f 20 66 61 72 |se..// c| too far|
|00001a00| 20 6c 65 66 74 0d 09 09 | 09 61 20 3d 20 63 3b 0d | left...|.a = c;.|
|00001a10| 09 09 7d 0d 09 77 68 69 | 6c 65 20 28 66 61 62 73 |..}..whi|le (fabs|
|00001a20| 28 64 29 20 3e 20 6b 45 | 70 73 69 6c 6f 6e 29 3b |(d) > kE|psilon);|
|00001a30| 0d 0d 09 72 65 74 75 72 | 6e 20 63 3b 0d 7d 0d 0d |...retur|n c;.}..|
|00001a40| 0d 0d 2f 2f 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |..//----|--------|
|00001a50| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00001a60| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00001a70| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00001a80| 2d 2d 2d 2d 2d 2d 0d 64 | 6f 75 62 6c 65 20 47 65 |------.d|ouble Ge|
|00001a90| 74 43 75 72 76 65 4c 65 | 6e 67 74 68 28 67 78 43 |tCurveLe|ngth(gxC|
|00001aa0| 75 72 76 65 20 2a 74 68 | 65 43 75 72 76 65 29 0d |urve *th|eCurve).|
|00001ab0| 7b 0d 09 43 75 72 76 65 | 43 6f 65 66 66 69 63 69 |{..Curve|Coeffici|
|00001ac0| 65 6e 74 73 09 63 63 3b | 0d 09 64 6f 75 62 6c 65 |ents.cc;|..double|
|00001ad0| 09 72 65 73 75 6c 74 3b | 0d 09 0d 09 43 6f 6d 70 |.result;|....Comp|
|00001ae0| 75 74 65 43 75 72 76 65 | 43 6f 65 66 66 69 63 69 |uteCurve|Coeffici|
|00001af0| 65 6e 74 73 28 74 68 65 | 43 75 72 76 65 2c 20 26 |ents(the|Curve, &|
|00001b00| 63 63 29 3b 0d 09 0d 09 | 69 66 20 28 63 63 2e 69 |cc);....|if (cc.i|
|00001b10| 73 4c 69 6e 65 61 72 29 | 20 7b 0d 09 0d 09 09 67 |sLinear)| {.....g|
|00001b20| 78 4c 69 6e 65 09 09 74 | 68 65 4c 69 6e 65 3b 0d |xLine..t|heLine;.|
|00001b30| 09 09 43 75 72 76 65 54 | 6f 4c 69 6e 65 28 74 68 |..CurveT|oLine(th|
|00001b40| 65 43 75 72 76 65 2c 20 | 26 74 68 65 4c 69 6e 65 |eCurve, |&theLine|
|00001b50| 29 3b 0d 09 09 72 65 73 | 75 6c 74 20 3d 20 47 65 |);...res|ult = Ge|
|00001b60| 74 4c 69 6e 65 4c 65 6e | 67 74 68 28 26 74 68 65 |tLineLen|gth(&the|
|00001b70| 4c 69 6e 65 29 3b 09 09 | 0d 09 0d 09 7d 20 65 6c |Line);..|....} el|
|00001b80| 73 65 20 7b 0d 09 0d 09 | 09 72 65 73 75 6c 74 20 |se {....|.result |
|00001b90| 3d 20 45 76 61 6c 75 61 | 74 65 43 6c 6f 73 65 64 |= Evalua|teClosed|
|00001ba0| 46 6f 72 6d 75 6c 61 28 | 26 63 63 2c 20 31 2e 30 |Formula(|&cc, 1.0|
|00001bb0| 29 3b 0d 09 09 0d 09 7d | 2f 2f 65 6e 64 20 69 66 |);.....}|//end if|
|00001bc0| 0d 09 09 0d 09 72 65 74 | 75 72 6e 20 72 65 73 75 |.....ret|urn resu|
|00001bd0| 6c 74 3b 0d 7d 0d 0d 0d | 2f 2f 2d 2d 2d 2d 2d 2d |lt;.}...|//------|
|00001be0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00001bf0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00001c00| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00001c10| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 0d 73 74 61 |--------|----.sta|
|00001c20| 74 69 63 20 76 6f 69 64 | 20 45 76 61 6c 75 61 74 |tic void| Evaluat|
|00001c30| 65 43 75 72 76 65 50 61 | 72 61 6d 65 74 72 69 7a |eCurvePa|rametriz|
|00001c40| 61 74 69 6f 6e 28 43 75 | 72 76 65 43 6f 65 66 66 |ation(Cu|rveCoeff|
|00001c50| 69 63 69 65 6e 74 73 2a | 09 63 63 2c 20 64 6f 75 |icients*|.cc, dou|
|00001c60| 62 6c 65 20 74 2c 20 67 | 78 50 6f 69 6e 74 2a 20 |ble t, g|xPoint* |
|00001c70| 74 68 65 50 6f 69 6e 74 | 29 0d 7b 0d 09 69 66 20 |thePoint|).{..if |
|00001c80| 28 74 68 65 50 6f 69 6e | 74 29 20 7b 0d 09 09 74 |(thePoin|t) {...t|
|00001c90| 68 65 50 6f 69 6e 74 2d | 3e 78 20 3d 20 28 46 69 |hePoint-|>x = (Fi|
|00001ca0| 78 65 64 29 20 28 6b 46 | 6c 6f 61 74 54 6f 46 69 |xed) (kF|loatToFi|
|00001cb0| 78 65 64 20 2a 20 28 63 | 63 2d 3e 61 30 20 2b 20 |xed * (c|c->a0 + |
|00001cc0| 74 20 2a 20 28 63 63 2d | 3e 61 31 20 2b 20 74 20 |t * (cc-|>a1 + t |
|00001cd0| 2a 20 28 63 63 2d 3e 61 | 32 29 29 29 29 3b 0d 09 |* (cc->a|2))));..|
|00001ce0| 09 74 68 65 50 6f 69 6e | 74 2d 3e 79 20 3d 20 28 |.thePoin|t->y = (|
|00001cf0| 46 69 78 65 64 29 20 28 | 6b 46 6c 6f 61 74 54 6f |Fixed) (|kFloatTo|
|00001d00| 46 69 78 65 64 20 2a 20 | 28 63 63 2d 3e 62 30 20 |Fixed * |(cc->b0 |
|00001d10| 2b 20 74 20 2a 20 28 63 | 63 2d 3e 62 31 20 2b 20 |+ t * (c|c->b1 + |
|00001d20| 74 20 2a 20 28 63 63 2d | 3e 62 32 29 29 29 29 3b |t * (cc-|>b2))));|
|00001d30| 0d 09 7d 2f 2f 65 6e 64 | 20 69 66 0d 7d 0d 0d 2f |..}//end| if.}../|
|00001d40| 2f 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |/-------|--------|
|00001d50| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00001d60| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00001d70| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00001d80| 2d 2d 2d 0d 76 6f 69 64 | 20 20 43 75 72 76 65 4c |---.void| CurveL|
|00001d90| 65 6e 67 74 68 54 6f 50 | 6f 69 6e 74 28 64 6f 75 |engthToP|oint(dou|
|00001da0| 62 6c 65 20 74 68 65 4c | 65 6e 67 74 68 2c 20 67 |ble theL|ength, g|
|00001db0| 78 43 75 72 76 65 20 2a | 74 68 65 43 75 72 76 65 |xCurve *|theCurve|
|00001dc0| 2c 20 67 78 50 6f 69 6e | 74 20 2a 74 68 65 50 6f |, gxPoin|t *thePo|
|00001dd0| 69 6e 74 2c 20 67 78 50 | 6f 69 6e 74 20 2a 74 68 |int, gxP|oint *th|
|00001de0| 65 54 61 6e 67 65 6e 74 | 29 0d 7b 0d 09 43 75 72 |eTangent|).{..Cur|
|00001df0| 76 65 43 6f 65 66 66 69 | 63 69 65 6e 74 73 09 63 |veCoeffi|cients.c|
|00001e00| 63 3b 0d 09 64 6f 75 62 | 6c 65 20 74 78 2c 20 74 |c;..doub|le tx, t|
|00001e10| 79 2c 20 6e 6f 72 6d 3b | 0d 09 64 6f 75 62 6c 65 |y, norm;|..double|
|00001e20| 20 74 3b 0d 09 0d 09 43 | 6f 6d 70 75 74 65 43 75 | t;....C|omputeCu|
|00001e30| 72 76 65 43 6f 65 66 66 | 69 63 69 65 6e 74 73 28 |rveCoeff|icients(|
|00001e40| 74 68 65 43 75 72 76 65 | 2c 20 26 63 63 29 3b 0d |theCurve|, &cc);.|
|00001e50| 09 0d 09 69 66 20 28 63 | 63 2e 69 73 4c 69 6e 65 |...if (c|c.isLine|
|00001e60| 61 72 29 20 7b 0d 09 0d | 09 09 67 78 4c 69 6e 65 |ar) {...|..gxLine|
|00001e70| 09 09 74 68 65 4c 69 6e | 65 3b 0d 09 09 43 75 72 |..theLin|e;...Cur|
|00001e80| 76 65 54 6f 4c 69 6e 65 | 28 74 68 65 43 75 72 76 |veToLine|(theCurv|
|00001e90| 65 2c 20 26 74 68 65 4c | 69 6e 65 29 3b 0d 09 09 |e, &theL|ine);...|
|00001ea0| 0d 09 09 4c 69 6e 65 4c | 65 6e 67 74 68 54 6f 50 |...LineL|engthToP|
|00001eb0| 6f 69 6e 74 28 74 68 65 | 4c 65 6e 67 74 68 2c 20 |oint(the|Length, |
|00001ec0| 26 74 68 65 4c 69 6e 65 | 2c 20 74 68 65 50 6f 69 |&theLine|, thePoi|
|00001ed0| 6e 74 2c 20 74 68 65 54 | 61 6e 67 65 6e 74 29 3b |nt, theT|angent);|
|00001ee0| 0d 09 09 0d 09 7d 20 65 | 6c 73 65 20 7b 0d 09 0d |.....} e|lse {...|
|00001ef0| 09 09 74 20 3d 20 4e 65 | 77 4c 65 6e 67 74 68 54 |..t = Ne|wLengthT|
|00001f00| 6f 50 61 72 61 6d 65 74 | 65 72 46 75 6e 63 74 69 |oParamet|erFuncti|
|00001f10| 6f 6e 28 26 63 63 2c 20 | 74 68 65 4c 65 6e 67 74 |on(&cc, |theLengt|
|00001f20| 68 29 3b 0d 09 09 45 76 | 61 6c 75 61 74 65 43 75 |h);...Ev|aluateCu|
|00001f30| 72 76 65 50 61 72 61 6d | 65 74 72 69 7a 61 74 69 |rveParam|etrizati|
|00001f40| 6f 6e 28 26 63 63 2c 20 | 74 2c 20 74 68 65 50 6f |on(&cc, |t, thePo|
|00001f50| 69 6e 74 29 3b 0d 09 09 | 74 78 20 3d 20 63 63 2e |int);...|tx = cc.|
|00001f60| 61 31 20 2b 20 74 20 2a | 20 32 2e 30 20 2a 20 28 |a1 + t *| 2.0 * (|
|00001f70| 63 63 2e 61 32 29 3b 09 | 09 2f 2f 20 74 68 61 74 |cc.a2);.|.// that|
|00001f80| 27 73 20 74 68 65 20 64 | 65 72 69 76 61 74 69 76 |'s the d|erivativ|
|00001f90| 65 0d 09 09 74 79 20 3d | 20 63 63 2e 62 31 20 2b |e...ty =| cc.b1 +|
|00001fa0| 20 74 20 2a 20 32 2e 30 | 20 2a 20 28 63 63 2e 62 | t * 2.0| * (cc.b|
|00001fb0| 32 29 3b 0d 09 09 6e 6f | 72 6d 20 3d 20 73 71 72 |2);...no|rm = sqr|
|00001fc0| 74 28 74 78 20 2a 20 74 | 78 20 2b 20 74 79 20 2a |t(tx * t|x + ty *|
|00001fd0| 20 74 79 29 3b 0d 09 09 | 69 66 20 28 74 68 65 54 | ty);...|if (theT|
|00001fe0| 61 6e 67 65 6e 74 20 26 | 26 20 28 6e 6f 72 6d 20 |angent &|& (norm |
|00001ff0| 3e 20 30 29 29 20 7b 0d | 09 09 09 74 68 65 54 61 |> 0)) {.|...theTa|
|00002000| 6e 67 65 6e 74 2d 3e 78 | 20 3d 20 28 46 69 78 65 |ngent->x| = (Fixe|
|00002010| 64 29 20 28 6b 46 6c 6f | 61 74 54 6f 46 69 78 65 |d) (kFlo|atToFixe|
|00002020| 64 20 2a 20 74 78 20 2f | 20 6e 6f 72 6d 29 3b 0d |d * tx /| norm);.|
|00002030| 09 09 09 74 68 65 54 61 | 6e 67 65 6e 74 2d 3e 79 |...theTa|ngent->y|
|00002040| 20 3d 20 28 46 69 78 65 | 64 29 20 28 6b 46 6c 6f | = (Fixe|d) (kFlo|
|00002050| 61 74 54 6f 46 69 78 65 | 64 20 2a 20 74 79 20 2f |atToFixe|d * ty /|
|00002060| 20 6e 6f 72 6d 29 3b 0d | 09 09 7d 0d 09 09 0d 09 | norm);.|..}.....|
|00002070| 7d 2f 2f 65 6e 64 20 69 | 66 0d 7d 0d 0d 0d 2f 2f |}//end i|f.}...//|
|00002080| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|00002090| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|000020a0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|000020b0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|000020c0| 2d 2d 0d 76 6f 69 64 20 | 44 65 74 65 72 6d 69 6e |--.void |Determin|
|000020d0| 65 53 75 62 4c 69 6e 65 | 28 67 78 4c 69 6e 65 20 |eSubLine|(gxLine |
|000020e0| 2a 74 68 65 4c 69 6e 65 | 2c 20 64 6f 75 62 6c 65 |*theLine|, double|
|000020f0| 20 61 2c 20 64 6f 75 62 | 6c 65 20 62 2c 20 67 78 | a, doub|le b, gx|
|00002100| 4c 69 6e 65 20 2a 73 75 | 62 4c 69 6e 65 29 0d 7b |Line *su|bLine).{|
|00002110| 0d 0d 09 4c 69 6e 65 4c | 65 6e 67 74 68 54 6f 50 |...LineL|engthToP|
|00002120| 6f 69 6e 74 28 61 2c 20 | 74 68 65 4c 69 6e 65 2c |oint(a, |theLine,|
|00002130| 20 26 73 75 62 4c 69 6e | 65 2d 3e 66 69 72 73 74 | &subLin|e->first|
|00002140| 2c 20 6e 69 6c 29 3b 0d | 09 4c 69 6e 65 4c 65 6e |, nil);.|.LineLen|
|00002150| 67 74 68 54 6f 50 6f 69 | 6e 74 28 62 2c 20 74 68 |gthToPoi|nt(b, th|
|00002160| 65 4c 69 6e 65 2c 20 26 | 73 75 62 4c 69 6e 65 2d |eLine, &|subLine-|
|00002170| 3e 6c 61 73 74 2c 20 6e | 69 6c 29 3b 0d 0d 7d 0d |>last, n|il);..}.|
|00002180| 2f 2f 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |//------|--------|
|00002190| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|000021a0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|000021b0| 2d 2d 2d 2d 2d 2d 2d 2d | 2d 2d 2d 2d 2d 2d 2d 2d |--------|--------|
|000021c0| 2d 2d 2d 2d 0d 76 6f 69 | 64 20 44 65 74 65 72 6d |----.voi|d Determ|
|000021d0| 69 6e 65 53 75 62 43 75 | 72 76 65 28 67 78 43 75 |ineSubCu|rve(gxCu|
|000021e0| 72 76 65 20 2a 74 68 65 | 43 75 72 76 65 2c 20 64 |rve *the|Curve, d|
|000021f0| 6f 75 62 6c 65 20 61 2c | 20 64 6f 75 62 6c 65 20 |ouble a,| double |
|00002200| 62 2c 20 67 78 43 75 72 | 76 65 20 2a 73 75 62 43 |b, gxCur|ve *subC|
|00002210| 75 72 76 65 29 0d 7b 0d | 09 43 75 72 76 65 43 6f |urve).{.|.CurveCo|
|00002220| 65 66 66 69 63 69 65 6e | 74 73 09 63 63 3b 0d 09 |efficien|ts.cc;..|
|00002230| 64 6f 75 62 6c 65 09 74 | 30 2c 20 74 31 3b 0d 09 |double.t|0, t1;..|
|00002240| 67 78 50 6f 69 6e 74 09 | 6d 69 64 50 6f 69 6e 74 |gxPoint.|midPoint|
|00002250| 3b 0d 09 0d 09 43 6f 6d | 70 75 74 65 43 75 72 76 |;....Com|puteCurv|
|00002260| 65 43 6f 65 66 66 69 63 | 69 65 6e 74 73 28 74 68 |eCoeffic|ients(th|
|00002270| 65 43 75 72 76 65 2c 20 | 26 63 63 29 3b 0d 09 0d |eCurve, |&cc);...|
|00002280| 09 69 66 20 28 63 63 2e | 69 73 4c 69 6e 65 61 72 |.if (cc.|isLinear|
|00002290| 29 20 7b 0d 09 0d 09 09 | 2f 2a 20 54 72 65 61 74 |) {.....|/* Treat|
|000022a0| 20 74 68 65 20 63 75 72 | 76 65 20 61 73 20 61 20 | the cur|ve as a |
|000022b0| 6c 69 6e 65 20 69 66 20 | 69 74 20 77 61 73 20 6c |line if |it was l|
|000022c0| 69 6e 65 61 72 20 2a 2f | 0d 09 09 67 78 4c 69 6e |inear */|...gxLin|
|000022d0| 65 09 74 68 65 4c 69 6e | 65 2c 20 73 75 62 4c 69 |e.theLin|e, subLi|
|000022e0| 6e 65 3b 0d 09 09 0d 09 | 09 43 75 72 76 65 54 6f |ne;.....|.CurveTo|
|000022f0| 4c 69 6e 65 28 74 68 65 | 43 75 72 76 65 2c 20 26 |Line(the|Curve, &|
|00002300| 74 68 65 4c 69 6e 65 29 | 3b 0d 09 09 09 09 0d 09 |theLine)|;.......|
|00002310| 09 44 65 74 65 72 6d 69 | 6e 65 53 75 62 4c 69 6e |.Determi|neSubLin|
|00002320| 65 28 26 74 68 65 4c 69 | 6e 65 2c 20 61 2c 20 62 |e(&theLi|ne, a, b|
|00002330| 2c 20 26 73 75 62 4c 69 | 6e 65 29 3b 0d 09 09 0d |, &subLi|ne);....|
|00002340| 09 09 73 75 62 43 75 72 | 76 65 2d 3e 66 69 72 73 |..subCur|ve->firs|
|00002350| 74 2e 78 20 3d 20 73 75 | 62 4c 69 6e 65 2e 66 69 |t.x = su|bLine.fi|
|00002360| 72 73 74 2e 78 3b 0d 09 | 09 73 75 62 43 75 72 76 |rst.x;..|.subCurv|
|00002370| 65 2d 3e 66 69 72 73 74 | 2e 79 20 3d 20 73 75 62 |e->first|.y = sub|
|00002380| 4c 69 6e 65 2e 66 69 72 | 73 74 2e 79 3b 0d 09 09 |Line.fir|st.y;...|
|00002390| 73 75 62 43 75 72 76 65 | 2d 3e 63 6f 6e 74 72 6f |subCurve|->contro|
|000023a0| 6c 2e 78 20 3d 20 28 73 | 75 62 4c 69 6e 65 2e 66 |l.x = (s|ubLine.f|
|000023b0| 69 72 73 74 2e 78 20 2b | 20 73 75 62 4c 69 6e 65 |irst.x +| subLine|
|000023c0| 2e 6c 61 73 74 2e 78 29 | 20 2f 20 32 3b 20 20 2f |.last.x)| / 2; /|
|000023d0| 2f 20 6d 61 6b 65 20 69 | 74 20 74 68 65 20 6d 69 |/ make i|t the mi|
|000023e0| 64 70 6f 69 6e 74 0d 09 | 09 73 75 62 43 75 72 76 |dpoint..|.subCurv|
|000023f0| 65 2d 3e 63 6f 6e 74 72 | 6f 6c 2e 79 20 3d 20 28 |e->contr|ol.y = (|
|00002400| 73 75 62 4c 69 6e 65 2e | 66 69 72 73 74 2e 79 20 |subLine.|first.y |
|00002410| 2b 20 73 75 62 4c 69 6e | 65 2e 6c 61 73 74 2e 79 |+ subLin|e.last.y|
|00002420| 29 20 2f 20 32 3b 0d 09 | 09 73 75 62 43 75 72 76 |) / 2;..|.subCurv|
|00002430| 65 2d 3e 6c 61 73 74 2e | 78 20 3d 20 73 75 62 4c |e->last.|x = subL|
|00002440| 69 6e 65 2e 6c 61 73 74 | 2e 78 3b 0d 09 09 73 75 |ine.last|.x;...su|
|00002450| 62 43 75 72 76 65 2d 3e | 6c 61 73 74 2e 79 20 3d |bCurve->|last.y =|
|00002460| 20 73 75 62 4c 69 6e 65 | 2e 6c 61 73 74 2e 79 3b | subLine|.last.y;|
|00002470| 0d 09 0d 09 7d 20 65 6c | 73 65 20 7b 0d 09 0d 09 |....} el|se {....|
|00002480| 09 2f 2a 20 63 6f 6d 70 | 75 74 65 20 74 68 65 20 |./* comp|ute the |
|00002490| 73 75 62 20 63 75 72 76 | 65 20 2a 2f 0d 09 09 0d |sub curv|e */....|
|000024a0| 09 09 74 30 20 3d 20 4e | 65 77 4c 65 6e 67 74 68 |..t0 = N|ewLength|
|000024b0| 54 6f 50 61 72 61 6d 65 | 74 65 72 46 75 6e 63 74 |ToParame|terFunct|
|000024c0| 69 6f 6e 28 26 63 63 2c | 20 61 29 3b 0d 09 09 74 |ion(&cc,| a);...t|
|000024d0| 31 20 3d 20 4e 65 77 4c | 65 6e 67 74 68 54 6f 50 |1 = NewL|engthToP|
|000024e0| 61 72 61 6d 65 74 65 72 | 46 75 6e 63 74 69 6f 6e |arameter|Function|
|000024f0| 28 26 63 63 2c 20 62 29 | 3b 0d 09 09 45 76 61 6c |(&cc, b)|;...Eval|
|00002500| 75 61 74 65 43 75 72 76 | 65 50 61 72 61 6d 65 74 |uateCurv|eParamet|
|00002510| 72 69 7a 61 74 69 6f 6e | 28 26 63 63 2c 20 74 30 |rization|(&cc, t0|
|00002520| 2c 20 26 73 75 62 43 75 | 72 76 65 2d 3e 66 69 72 |, &subCu|rve->fir|
|00002530| 73 74 29 3b 0d 09 09 45 | 76 61 6c 75 61 74 65 43 |st);...E|valuateC|
|00002540| 75 72 76 65 50 61 72 61 | 6d 65 74 72 69 7a 61 74 |urvePara|metrizat|
|00002550| 69 6f 6e 28 26 63 63 2c | 20 74 31 2c 20 26 73 75 |ion(&cc,| t1, &su|
|00002560| 62 43 75 72 76 65 2d 3e | 6c 61 73 74 29 3b 0d 09 |bCurve->|last);..|
|00002570| 09 45 76 61 6c 75 61 74 | 65 43 75 72 76 65 50 61 |.Evaluat|eCurvePa|
|00002580| 72 61 6d 65 74 72 69 7a | 61 74 69 6f 6e 28 26 63 |rametriz|ation(&c|
|00002590| 63 2c 20 30 2e 35 20 2a | 20 28 74 30 20 2b 20 74 |c, 0.5 *| (t0 + t|
|000025a0| 31 29 2c 20 26 6d 69 64 | 50 6f 69 6e 74 29 3b 0d |1), &mid|Point);.|
|000025b0| 09 09 2f 2f 20 6d 69 64 | 50 74 20 3d 20 28 73 74 |..// mid|Pt = (st|
|000025c0| 61 72 74 20 2b 20 65 6e | 64 29 20 2f 20 34 20 2b |art + en|d) / 4 +|
|000025d0| 20 63 6f 6e 74 72 6f 6c | 20 2f 20 32 20 3b 20 63 | control| / 2 ; c|
|000025e0| 6f 6e 74 72 6f 6c 20 3d | 20 6d 69 64 50 74 20 2a |ontrol =| midPt *|
|000025f0| 20 32 20 2d 20 28 73 74 | 61 72 74 20 2b 20 65 6e | 2 - (st|art + en|
|00002600| 64 29 20 2f 20 32 0d 09 | 09 2f 2f 20 6e 6f 74 65 |d) / 2..|.// note|
|00002610| 20 74 68 61 74 20 77 65 | 20 63 68 6f 6f 73 65 20 | that we| choose |
|00002620| 74 6f 20 69 67 6e 6f 72 | 65 20 61 72 69 74 68 6d |to ignor|e arithm|
|00002630| 65 74 69 63 20 6f 76 65 | 72 66 6c 6f 77 2c 20 68 |etic ove|rflow, h|
|00002640| 65 72 65 3a 20 0d 09 09 | 2f 2f 20 75 73 61 62 6c |ere: ...|// usabl|
|00002650| 65 20 63 6f 6f 72 64 69 | 6e 61 74 65 20 72 61 6e |e coordi|nate ran|
|00002660| 67 65 20 6c 69 6d 69 74 | 65 64 20 74 6f 20 2d 30 |ge limit|ed to -0|
|00002670| 78 33 46 46 46 20 2e 2e | 2e 20 30 78 33 46 46 46 |x3FFF ..|. 0x3FFF|
|00002680| 20 21 0d 09 09 73 75 62 | 43 75 72 76 65 2d 3e 63 | !...sub|Curve->c|
|00002690| 6f 6e 74 72 6f 6c 2e 78 | 20 3d 20 28 6d 69 64 50 |ontrol.x| = (midP|
|000026a0| 6f 69 6e 74 2e 78 20 3c | 3c 20 31 29 20 2d 20 28 |oint.x <|< 1) - (|
|000026b0| 28 73 75 62 43 75 72 76 | 65 2d 3e 66 69 72 73 74 |(subCurv|e->first|
|000026c0| 2e 78 20 2b 20 73 75 62 | 43 75 72 76 65 2d 3e 6c |.x + sub|Curve->l|
|000026d0| 61 73 74 2e 78 29 20 3e | 3e 20 31 29 3b 0d 09 09 |ast.x) >|> 1);...|
|000026e0| 73 75 62 43 75 72 76 65 | 2d 3e 63 6f 6e 74 72 6f |subCurve|->contro|
|000026f0| 6c 2e 79 20 3d 20 28 6d | 69 64 50 6f 69 6e 74 2e |l.y = (m|idPoint.|
|00002700| 79 20 3c 3c 20 31 29 20 | 2d 20 28 28 73 75 62 43 |y << 1) |- ((subC|
|00002710| 75 72 76 65 2d 3e 66 69 | 72 73 74 2e 79 20 2b 20 |urve->fi|rst.y + |
|00002720| 73 75 62 43 75 72 76 65 | 2d 3e 6c 61 73 74 2e 79 |subCurve|->last.y|
|00002730| 29 20 3e 3e 20 31 29 3b | 0d 09 09 0d 09 7d 2f 2f |) >> 1);|.....}//|
|00002740| 65 6e 64 20 69 66 0d 7d | 0d 0d 00 00 00 00 00 00 |end if.}|........|
|00002750| 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 |........|........|
|00002760| 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 |........|........|
|00002770| 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 |........|........|
|00002780| 00 00 01 00 00 00 01 76 | 00 00 00 76 00 00 00 52 |.......v|...v...R|
|00002790| e7 18 20 26 2e 00 08 45 | ec 8c 54 78 2b 4a 83 6c |.. &...E|..Tx+J.l|
|000027a0| 04 44 83 78 2d 10 03 48 | 80 48 c0 b6 80 66 06 45 |.D.x-..H|.H...f.E|
|000027b0| 0f 43 6f 6d 70 75 74 65 | 4c 65 6e 67 74 68 2e 63 |.Compute|Length.c|
|000027c0| 02 00 00 00 54 45 58 54 | 43 57 49 45 01 00 ff ff |....TEXT|CWIE....|
|000027d0| 00 00 54 45 58 54 43 57 | 49 45 01 00 ff ff ff ff |..TEXTCW|IE......|
|000027e0| 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 |........|........|
|000027f0| 00 00 ad 99 c8 e3 00 00 | 26 ca 00 00 01 c8 04 d0 |........|&.......|
|00002800| 88 b0 86 6c 28 20 4a d1 | c4 3f 30 30 00 48 6c 8c |...l( J.|.?00.Hl.|
|00002810| 30 48 6e ff f6 61 ff 00 | 01 01 e2 3f 3c 00 05 48 |0Hn..a..|...?<..H|
|00002820| 6e ff f6 4e ba ed 96 4f | ef 00 10 60 0e 3f 3c 00 |n..N...O|...`.?<.|
|00002830| 05 2f 2c 8c 38 4e ba ed | 84 5c 4f 54 43 b6 45 6d |./,.8N..|.\OTC.Em|
|00002840| ba 4c df 04 78 4e 5e 4e | 75 4e 56 ff f6 48 e7 1e |.L..xN^N|uNV..H..|
|00002850| 20 24 6e 00 08 28 2e 00 | 0c 2c 2e 00 10 3a 2e 00 | $n..(..|.,...:..|
|00002860| 14 76 00 60 46 30 43 20 | 04 d0 88 b0 86 6c 2c 20 |.v.`F0C |.....l, |
|00002870| 4a d1 c4 70 00 10 30 30 | 00 3f 00 48 6c 8c 26 48 |J..p..00|.?.Hl.&H|
|00002880| 00 00 00 1e 00 2a 00 18 | 02 6d 03 02 00 5c 00 18 |.....*..|.m...\..|
|00002890| 01 d7 02 80 00 00 15 c0 | 00 00 00 00 00 00 00 00 |........|........|
|000028a0| 00 00 00 00 00 48 00 09 | 4d 6f 6e 61 63 6f 00 00 |.....H..|Monaco..|
|000028b0| 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 |........|........|
|000028c0| 00 00 00 00 00 00 00 00 | 00 03 00 04 00 57 00 01 |........|.....W..|
|000028d0| 01 de 02 7e 00 57 00 01 | 01 de 02 7e ae 6d bd 84 |...~.W..|...~.m..|
|000028e0| 00 00 0e 0d 00 00 0e 0d | 00 00 0b 3c 01 00 00 00 |........|...<....|
|000028f0| 00 04 00 01 00 01 00 00 | 01 00 00 00 01 76 00 00 |........|.....v..|
|00002900| 00 76 00 00 00 52 01 9d | b0 c4 19 b6 00 00 00 1c |.v...R..|........|
|00002910| 00 52 00 01 4d 50 53 52 | 00 01 00 12 4d 57 42 42 |.R..MPSR|....MWBB|
|00002920| 00 00 00 2a 03 f0 ff ff | 00 00 00 00 00 00 00 00 |...*....|........|
|00002930| 03 ed ff ff 00 00 00 22 | 00 00 00 00 03 f0 ff ff |......."|........|
|00002940| 00 00 00 6e 00 00 00 00 | 00 00 00 00 00 00 00 00 |...n....|........|
|00002950| 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 |........|........|
|00002960| 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 |........|........|
|00002970| 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 |........|........|
+--------+-------------------------+-------------------------+--------+--------+